package com.neuedu.javase.tools.homework;

import com.neuedu.javase.tools.input.InputUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/***
 * 项目名称:  MyJavaSE 
 * 包：  com.neuedu.javase.tools.homework 
 * date:   2025/10/31   8:51  
 * 描述:  
 *  @author : 张金山
 *  作者博客:   https://blog.fulfill.com.cn
 */
public class HomeWork1 {

    /**
     * 1. 编写一个程序，实现从命令行参数输入两个字符串类型的数值，并计算输出两个数值的和。
     * 2. 编写一个程序，实现从命令行参数输入一字符串，统计该字符串中字符“e”出现的次数。
     * 3. 巴黎时间比北京时间晚7个小时，纽约时间比北京时间晚12个小时，试编写一程序，根据输入的北京时间输出相应的巴黎和纽约时间。
     * 4. 编写一个方法验证用户输入的日期格式是否正确，要求格式为：2006/12/12。方法的参数是要验证的日期字符串，如果格式正确返回true，否则返回false。
     * 5. 请编程实现：由键盘输入的任意一组字符，统计其中大写字母的个数m和小写字母的个数n，并输出m、n中的较大者。
     * 6. 输入一行字符，将其中的字母变成其后续的第3个字母，输出。例：a→d，x　→　a；y　→　b；编程实现。
     * 7. 输入一个时间字符串"xxxx-xx-xx" 显示出对应的XXXX年XX月XX日
     * 8. 做一个学生类Student，其中包括属性学号id，学生姓名sname，在类中重写一个equals方法来根据学号和姓名来判断两个学生的是不是同一个学生，并测试该功能方法
     * 9. 做一个学生类，其中包括属性学号id，学生姓名sname，年龄sage(String类型)，在类中写一个方法来实现年龄自动增加的功能(原年龄上加1)，并测试该功能方法
     */

    //1. 编写一个程序，实现从命令行参数输入两个字符串类型的数值，并计算输出两个数值的和。
    static void m1(){
        int numa = InputUtils.inputInt("请输入第一个数字");
        int numb = InputUtils.inputInt("请输入第二个数字");


        System.out.println("numa + numb =  "+(numa + numb));

    }

    // 2. 编写一个程序，实现从命令行参数输入一字符串，统计该字符串中字符“e”出现的次数。
    static void m2(){
        String line = InputUtils.input("请输入一行字符");
        int count = 0;

        if(line == null || line.length() == 0){
            throw new IllegalArgumentException("输入的数据不正确");
        }


        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            if(c == 'e'){
                count++;
            }
        }

        // JDK 15+
        // String info = String.format("一共出现%d次e  ", count);
        String info = """
                一共出现 %d 次e """.formatted(count  );


        System.out.println(info);




    }


    //3. 巴黎时间比北京时间晚7个小时，纽约时间比北京时间晚12个小时，试编写一程序，根据输入的北京时间输出相应的巴黎和纽约时间
    static void m3() throws ParseException {

        String beijingTimeStr = InputUtils.input("请输入北京时间(yyyy-MM-dd HH:mm:ss)");

        //beijingTimeStr  -- Date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(beijingTimeStr);


        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);


        //巴黎时间
        Calendar parisTime = (Calendar) calendar.clone();
        parisTime.add(Calendar.HOUR_OF_DAY, -7);

        // 纽约时间
        Calendar newYorkTime = (Calendar) calendar.clone();
        newYorkTime.add(Calendar.HOUR_OF_DAY, -12);


        System.out.println("巴黎： "+sdf.format(parisTime.getTime()));;
        System.out.println("纽约： "+sdf.format(newYorkTime.getTime()));;



    }


    // * 4. 编写一个方法验证用户输入的日期格式是否正确，要求格式为：2006/12/12。方法的参数是要验证的日期字符串，如果格式正确返回true，否则返回false。
    public static boolean validateDateTime(String dataWithStr){
        boolean  success = false;


        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        try {
            sdf.parse(dataWithStr);

            success = true;
        } catch (ParseException e) {
            // throw new RuntimeException(e);
        }


        return success;

    }

    static void m4(){
        String str = InputUtils.input("请输入一个日期(2006/05/18)");
        boolean  success  = validateDateTime(str);
        if(success){
            System.out.println("输入的格式正确");
        }else{
            System.err.println("输入的格式有误");
        }
    }


    // 5. 请编程实现：由键盘输入的任意一组字符，统计其中大写字母的个数m和小写字母的个数n，并输出m、n中的较大者。
    static void m5(){
        String line = InputUtils.input("请输入一行字符");

        int bigLetterCount = 0;
        int smallLetterCount = 0;
        // Character.isAlphabetic()
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            if(c >=65 && c <= 90){
                bigLetterCount++;
            }
            if(c >=97 && c <= 122){
                smallLetterCount++;
            }
        }

        int max  = Math.max(bigLetterCount,smallLetterCount);

        System.out.println("bigLetterCount = " + bigLetterCount);
        System.out.println("smallLetterCount = " + smallLetterCount);
        System.out.println("max = " + max);


    }

    // 6 输入一行字符，将其中的字母变成其后续的第3个字母，输出。例：a→d，x　→　a；y　→　b；编程实现。
    static void m6(){
        String line = InputUtils.input("请输入一行字符");

        //临时存储的区域
        char chars[] = new char[line.length()];
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            //小写字母
            if(c >=97 && c <= 119){  // a---w
                //abcdefghijklmnopqrstuvw    xyz
                chars[i] = (char)(c +3);

            } else if (c >=120 && c <= 122){
                chars[i] = (char)(c -23);
            }

            else{
                chars[i] = c;
            }
        }

        System.out.println(new String(chars));

    }


    //  * 7. 输入一个时间字符串"xxxx-xx-xx" 显示出对应的XXXX年XX月XX日
    static void m7(){
        String timeOfStr = InputUtils.input("请输入一个时间(xxxx-xx-xx)");

        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");

        String result = null;
        try {
            Date date = sdf1.parse(timeOfStr);


            result = sdf2.format(date);


        } catch (ParseException e) {
            // e.printStackTrace();
            System.err.println("输入的格式有误");

        }

        if(result != null && result.length()>0){
            System.out.println("转换完成后的格式 ： "+result);
        }


    }

    public static void main(String[] args) throws ParseException {

        // m1();

        // m2();

        // m3();

        // m4();

        // m5();

        // m6();
        m7();


        // System.out.println("((int)'A') = " + ((int) 'A'));
        // System.out.println("((int)'Z') = " + ((int) 'Z'));
        // System.out.println("((int)'a') = " + ((int) 'a'));
        // System.out.println("((int)'z') = " + ((int) 'z'));
    }
}


//     //      * 9. 做一个学生类，其中包括属性学号id，学生姓名sname，年龄sage(String类型)，在类中写一个方法来实现年龄自动增加的功能(原年龄上加1)，并测试该功能方法
class Student {
    private Integer id ;
    private String name ;
    private String sage;

    public Student() {
    }

    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Student(Integer id, String name, String sage) {
        this.id = id;
        this.name = name;
        this.sage = sage;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void increamentAge(){
        //
        if(this.sage  == null){
            this.sage = "0";
        }

        int age = Integer.parseInt(this.sage);
        age++;
        this.sage = String.valueOf(age);


    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;
        return id.equals(student.id) && name.equals(student.name);
    }

    @Override
    public int hashCode() {
        int result = id.hashCode();
        result = 31 * result + name.hashCode();
        return result;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sage='" + sage + '\'' +
                '}';
    }

    public static void main(String[] args) {
        Student student1 = new Student(1,"张三 ");
        Student student2 = new Student(1,"张三 ");

        System.out.println("(student1 == student2) = " + (student1 == student2));
        System.out.println(" (student1 .equals( student2) = " + (student1 .equals( student2)));


        Student stu = new Student(2,"李逵","18");

        stu.increamentAge();
        System.out.println("stu = " + stu);


        stu.increamentAge();
        System.out.println("stu = " + stu);


        stu.increamentAge();
        System.out.println("stu = " + stu);

    }
}
